/*
 * @lc app=leetcode.cn id=92 lang=java
 *
 * [92] 反转链表 II
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    // 实际上是 [left-1,right)
    // 链表结构  head...->z  r<-....<-pre  cur->..->null
    // 所以翻转后把 z->pre , r->cur，返回头节点head即可
    // 特殊情况是从1开始翻转，那么  z=null，直接返回head即可 
    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode pre = null , cur = head ,next = null;
        int i=1;
        for(;i<left ;i++){
            pre = cur;
            cur = cur.next;
        }
        ListNode z = pre;//左边
        ListNode r = cur;//尾部
        while(cur !=null && i<=right){
            next = cur.next;
            cur.next = pre;
            pre = cur;//移动
            cur = next;//移动
            i++;
        }
        r.next=cur;//尾部接cur
        
        if(z==null)//证明一开始的Pre = null， 证明要从最左边开始反转。说明前面没有需要接上的了
            return pre;//返回翻转链表的头

        z.next = pre;//左边接Pre
        
        return head;
    }
}
// @lc code=end

